package main

import (
	"bytes"
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/canvas"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
	"github.com/ajstarks/svgo"
	"github.com/fogleman/gg" // 用于处理 SVG
	"image"
	"image/color"
	"image/draw"
	"image/png"
	"os"
	"os/exec"
)

var (
	lineCount int
	svgFile   = "polyline.svg"
)

func main() {
	myApp := app.New()
	myWindow := myApp.NewWindow("Dynamic Polyline Example")
	lineCount = 1
	// 加载初始图像
	img := &canvas.Image{}
	//canvas.NewImageFromImage(*generateImage())
	img.FillMode = canvas.ImageFillOriginal
	img = generateImage()

	// 更新图像的函数
	updateSVG := func() {
		lineCount++
		newImage := generateImage() // 生成新的图像
		img = newImage
		//img.Image = *newImage       // 更新图像
		//img.Refresh()               // 刷新图像
	}

	// 创建按钮来动态增加折线
	button := widget.NewButton("Add Polyline", func() {
		updateSVG() // 增加折线
	})

	// 设置窗口内容
	myWindow.SetContent(container.NewVBox(img, button))

	// 显示窗口
	myWindow.ShowAndRun()
}

// generateImage 生成带有折线的图像
func generateImage() *canvas.Image {
	// 创建图像画布
	img := image.NewRGBA(image.Rect(0, 0, 200, 200))
	draw.Draw(img, img.Bounds(), &image.Uniform{color.White}, image.Point{}, draw.Src)

	// 使用 bytes.Buffer 创建内存中的 SVG
	var buf bytes.Buffer
	svgContent := svg.New(&buf)
	svgContent.Start(200, 200)
	svgContent.Circle(100, 100, 80, "fill:red")
	svgContent.Text(100, 100, "asads", "font-size:20px;text-anchor:middle;fill:white")

	// 绘制折线
	for i := 0; i < lineCount; i++ {
		x1, y1 := 10+i*20, 10
		x2, y2 := 10+i*20, 190
		svgContent.Line(x1, y1, x2, y2, "stroke:black;stroke-width:2")
	}

	svgContent.End()

	// 使用 gg 库将 SVG 渲染为图像
	o := convertSVGToImage(buf.String())
	o.SetMinSize(fyne.NewSize(200, 200))
	return o
}

// convertSVGToImage 将 SVG 字符串转换为 image.Image
func convertSVGToImage(svgStr string) *canvas.Image {
	const width = 200
	const height = 200
	dc := gg.NewContext(width, height)

	// 使用 gg 渲染 SVG
	dc.DrawString(svgStr, float64(width), float64(height))

	// 返回图像
	img := dc.Image()
	buf := new(bytes.Buffer)
	png.Encode(buf, img) // 将图像编码为 PNG

	return canvas.NewImageFromReader(buf, "image/png")
}

// convertSVGToImage 将 SVG 字符串转换为 image.Image
func convertSVGToImage1(svgStr string) image.Image {
	// 创建一个新的上下文
	const width = 200
	const height = 200
	dc1 := gg.NewContext(width, height)

	// 使用 gg 渲染 SVG
	dc1.DrawString(svgStr, float64(width), float64(height))

	// 返回图像
	return dc1.Image()
}
func svgToPNG(svgBuf *bytes.Buffer) ([]byte, error) {
	// Use an external tool to convert SVG to PNG
	cmd := exec.Command("inkscape", "--export-type=png", "--export-filename=output.png", "-")
	cmd.Stdin = svgBuf
	if err := cmd.Run(); err != nil {
		return nil, err
	}

	// Read the generated PNG file
	imgData, err := os.ReadFile("output.png")
	if err != nil {
		return nil, err
	}

	return imgData, nil
}

// createSVG 创建 SVG 文件
func createSVG(canvas1 *svg.SVG, filePath string, lines int) {
	//f, err := os.Create(filePath)
	//if err != nil {
	//	panic(err)
	//}
	//defer f.Close()

	x1, y1 := 10+lines*11, 10
	x2, y2 := 10+lines*11, 190
	canvas1.Line(x1, y1, x2, y2, "stroke:black;stroke-width:2")

	//for i := 0; i < lines; i++ {
	//	// 每条折线的点
	//	x1, y1 := 10+i*11, 10
	//	x2, y2 := 10+i*11, 190
	//	canvas1.Line(x1, y1, x2, y2, "stroke:black;stroke-width:2")
	//}

	canvas1.End()
}
